package top.tagao.m03_beHavioralPatterns.b_07_observer;

import top.tagao.m03_beHavioralPatterns.b_07_observer.publisher.WeatherData;
import top.tagao.m03_beHavioralPatterns.b_07_observer.subscriber.BaiduSite;
import top.tagao.m03_beHavioralPatterns.b_07_observer.subscriber.CurrentConditions;

/**
 * 观察者模式
 *
 * @author Viktor_Liu
 * @Date 2022/8/14 10:27
 * <p>
 * 1. 发布者（Publisher）会向其他对象发送值得关注的事件。事
 * 件会在发布者自身状态改变或执行特定行为后发生。发布者
 * 中包含一个允许新订阅者加入和当前订阅者离开列表的订阅
 * 构架。
 * <p>
 * 2. 当新事件发生时，发送者会遍历订阅列表并调用每个订阅者
 * 对象的通知方法。该方法是在订阅者接口中声明的。
 * <p>
 * 3. 订阅者（Subscriber）接口声明了通知接口。 在绝大多数情
 * 况下，该接口仅包含一个 update 更新 方法。该方法可以
 * 拥有多个参数，使发布者能在更新时传递事件的详细信息。
 * <p>
 * 4. 具体订阅者（Concrete Subscribers）可以执行一些操作来回
 * 应发布者的通知。 所有具体订阅者类都实现了同样的接口，
 * 因此发布者不需要与具体类相耦合。
 */
public class Main {
    public static void main(String[] args) {
        //1.创建一个发布者
        WeatherData weatherData = new WeatherData();

        //2. 创建观察者
        CurrentConditions currentConditions = new CurrentConditions();
        BaiduSite baiduSite = new BaiduSite();

        //3. 发布者中注册观察者
        weatherData.registerObserver(currentConditions);
        weatherData.registerObserver(baiduSite);

        //测试
        System.out.println("通知各个注册的观察者, 看看信息");
        weatherData.setData(10f, 100f, 30.3f);
        weatherData.removeObserver(currentConditions);


        //测试
        System.out.println("通知各个注册的观察者, 看看信息");
        weatherData.setData(10f, 100f, 30.3f);
    }
}
